import 'dart:typed_data';

import 'package:bluetooth_protocols_plugin/src/base/realtime/realtime_error_base.dart';
import 'package:bluetooth_protocols_plugin/src/tools/bit_utils.dart';
import 'package:bluetooth_protocols_plugin/src/tools/utils.dart';

/*
  // 实时故障信息   8字节
typedef ARM_PACKED struct{
    //故障 32 位
    uint16_t i_phase_sensor          : 1; //0 相电流传感器正常   1 相电流传感器故障
    uint16_t i_bus_sensor            : 1; //0 总电流传感器正常   1 总电流传感器故障
    uint16_t motor_hall1             : 1; //0 电机霍尔1正常      1 电机霍尔1故障
    uint16_t motor_hall2             : 1; //0 电机霍尔2正常      1 电机霍尔2故障
    uint16_t battery_error           : 1; //0 电池正常           1 电池故障（电池内部报错）
    uint16_t imu_sensor              : 1; //0 姿态传感器正常     1 姿态传感器故障
    uint16_t mc_comm1                : 1; //0 驱动器通讯正常     1 驱动器通讯故障（人机板无法收到驱动板数据）
    uint16_t mc_comm2                : 1; //0 驱动器通讯正常     1 驱动器通讯故障（驱动板无法收到人机板数据）
    uint16_t ble_comm1               : 1; //0 蓝牙板通讯正常     1 蓝牙板通讯故障（人机板无法收到蓝牙板数据）
    uint16_t ble_comm2               : 1; //0 蓝牙板通讯正常     1 蓝牙板通讯故障（蓝牙板无法收到人机板数据）
    uint16_t battery_comm_lost       : 1; //0 电池-驱动板通讯正常1 电池-驱动板通讯故障
    uint16_t battery_cross_comm_lost : 1; //0 电池间通讯正常     1 电池间通讯故障
    uint16_t mos_temp_sensor         : 1; //0 MOS 温控正常       1 MOS 温控故障
    uint16_t motor_temp_sensor       : 1; //0 电机温控正常       1 电机温控故障
    uint16_t board_temp_sensor       : 1; //0 主板高温区温控正常 1 主板高温区温控故障
    uint16_t fan                     : 1; //0 散热风扇正常       1 散热风扇故障
    uint16_t rtc                     : 1; //0 RTC模块正常        1 RTC 模块故障
    uint16_t ext_rom                 : 1; //0 外部存储器正常     1 外部存储器故障
    uint16_t v_bus_sensor            : 1; //0 总电压传感器正常   1 总电压传感器故障
    uint16_t v_battery_sensor        : 1; //0 电池电压传感器正常 1 电池电压传感器故障
    uint16_t cannot_power_off        : 1; //0 未发现无法断电异常 1 无法正常断电故障
    uint16_t cannot_charge           : 1; //0 未发现无法充电故障 1 无法充电故障
    uint16_t tbox_comm               : 1; //0 云盒通信正常       1 云盒通信故障
    uint16_t error_reserve           : 9; //0 保留

    //警告 32 位
    uint16_t under_voltage           : 1; //0 电压（母线）正常   1 欠压警告
    uint16_t over_voltage            : 1; //0 电压（母线）正常   1 过压警告
    uint16_t over_current            : 2; //0 电流（母线）正常   1 电流过大警告   2 低电骑行电流过大警告  3 低电推行电流过大警告
    uint16_t low_battery             : 2; //0 电量正常           1~3 低电等级1~3
    uint16_t mos_over_temp           : 1; //0 MOS温度正常        1 MOS温度过高警告
    uint16_t motor_over_temp         : 1; //0 电机温度正常       1 电机温度过高警告
    uint16_t board_over_temp         : 1; //0 主板高温区温度正常 1 主板高温区温度过高警告
    uint16_t cpu_over_temp           : 1; //0 CPU 温度正常       1 CPU 温度过高警告
    uint16_t imu_over_temp           : 1; //0 IMU 温度正常       1 IMU 温度过高警告
    uint16_t over_speed              : 1; //0 未超速             1 超速警告
    uint16_t output_saturation       : 1; //0 矢量电压未饱和     1 矢量电压饱和警告
    uint16_t motor_spin              : 1; //0 未空转             1 空转警告
    uint16_t motor_stall             : 1; //0 电机未堵转         1 电机堵转警告
    uint16_t posture_error           : 1; //0 骑行时姿态正常     1 倾角过大警告

    uint16_t risk_behaviour          : 1; //0 骑行状态正常       1 危险骑行动作警告
    uint16_t motor_no_load           : 1; //0 未检测到空载       1 电机空载保护警告
    uint16_t no_self_test            : 1; //0 已通过必要的自检   1 存在必要的自检项未进行或未通过警告
    uint16_t power_key_long_press    : 1; //0 电源按键未发现异常 1 电源按键被长时间按下警告
    uint16_t some_batteries_not_work : 1; //0 未发现有电池不工作 1 有部分电池未工作警告
    uint16_t battery_cali_error      : 1; //0 未发现电池电压校准异常 1 电池电压校准异常警告
    uint16_t battery_warning         : 1; //0 电池无报警         1 电池报警
    uint16_t battery_protect         : 1; //0 电池未保护         1 电池保护
    uint16_t charge_over_current     : 1; //0 充电未过流         1 充电过流（由驱动板检测的过流）
    uint16_t dc_output_over_current  : 1; //0 直流输出口未过流   1 直流输出口过流
    uint16_t sw_combination          : 1; //0 未发现软件不匹配   1 各组件软件不匹配警告
    uint16_t force_dfu               : 1; //0 无强制固件升级     1 强制固件升级警告
    uint16_t device_lock             : 1; //0 未锁定             1 车辆已被锁定警告
    uint16_t hw_combination          : 1; //0 未发现硬件不匹配   1 各组件硬件不匹配警告
    uint16_t fan_low_speed           : 1; //0 未发现风扇转速过低 1 风扇转速过低警告（会使前灯最大亮度被迫降低）
    uint16_t hw_over_current         : 1; //0 未出现硬件过流     1 硬件过流保护
  }GNUC_PACKED VX_ERROR;
*/

// Lorin 实时错误
abstract class LorinRealtimeError extends RealtimeErrorBase {
  // 故障信息（32 位）
  bool iPhaseSensor = false; // 0 相电流传感器正常 1 相电流传感器故障
  bool iBusSensor = false; // 0 总电流传感器正常 1 总电流传感器故障
  bool motorHall1 = false; // 0 电机霍尔1正常 1 电机霍尔1故障
  bool motorHall2 = false; // 0 电机霍尔2正常 1 电机霍尔2故障
  bool batteryError = false; // 0 电池正常 1 电池故障（电池内部报错）
  bool imuSensor = false; // 0 姿态传感器正常 1 姿态传感器故障
  bool mcComm1 = false; // 0 驱动器通讯正常 1 驱动器通讯故障（人机板无法收到驱动板数据）
  bool mcComm2 = false; // 0 驱动器通讯正常 1 驱动器通讯故障（驱动板无法收到人机板数据）
  bool bleComm1 = false; // 0 蓝牙板通讯正常 1 蓝牙板通讯故障（人机板无法收到蓝牙板数据）
  bool bleComm2 = false; // 0 蓝牙板通讯正常 1 蓝牙板通讯故障（蓝牙板无法收到人机板数据）
  bool batteryCommLost = false; // 0 电池-驱动板通讯正常 1 电池-驱动板通讯故障
  bool batteryCrossCommLost = false; // 0 电池间通讯正常 1 电池间通讯故障
  bool mosTempSensor = false; // 0 MOS 温控正常 1 MOS 温控故障
  bool motorTempSensor = false; // 0 电机温控正常 1 电机温控故障
  bool boardTempSensor = false; // 0 主板高温区温控正常 1 主板高温区温控故障
  bool fan = false; // 0 散热风扇正常 1 散热风扇故障
  bool rtc = false; // 0 RTC模块正常 1 RTC 模块故障
  bool extRom = false; // 0 外部存储器正常 1 外部存储器故障
  bool vBusSensor = false; // 0 总电压传感器正常 1 总电压传感器故障
  bool vBatterySensor = false; // 0 电池电压传感器正常 1 电池电压传感器故障
  bool cannotPowerOff = false; // 0 未发现无法断电异常 1 无法正常断电故障
  bool cannotCharge = false; // 0 未发现无法充电故障 1 无法充电故障
  bool tboxComm = false; // 0 云盒通信正常 1 云盒通信故障
  int errorReserve = 0; // 9 位保留字段

  // 警告信息（32 位）
  bool underVoltage = false; // 0 电压（母线）正常 1 欠压警告
  bool overVoltage = false; // 0 电压（母线）正常 1 过压警告
  int overCurrent = 0; // 0 电流（母线）正常 1 电流过大警告 2 低电骑行电流过大警告 3 低电推行电流过大警告
  int lowBattery = 0; // 0 电量正常 1~3 低电等级1~3
  bool mosOverTemp = false; // 0 MOS温度正常 1 MOS温度过高警告
  bool motorOverTemp = false; // 0 电机温度正常 1 电机温度过高警告
  bool boardOverTemp = false; // 0 主板高温区温度正常 1 主板高温区温度过高警告
  bool cpuOverTemp = false; // 0 CPU 温度正常 1 CPU 温度过高警告
  bool imuOverTemp = false; // 0 IMU 温度正常 1 IMU 温度过高警告
  bool overSpeed = false; // 0 未超速 1 超速警告
  bool outputSaturation = false; // 0 矢量电压未饱和 1 矢量电压饱和警告
  bool motorSpin = false; // 0 未空转 1 空转警告
  bool motorStall = false; // 0 电机未堵转 1 电机堵转警告
  bool postureError = false; // 0 骑行时姿态正常 1 倾角过大警告
  bool riskBehaviour = false; // 0 骑行状态正常 1 危险骑行动作警告
  bool motorNoLoad = false; // 0 未检测到空载 1 电机空载保护警告
  bool noSelfTest = false; // 0 已通过必要的自检 1 存在必要的自检项未进行或未通过警告
  bool powerKeyLongPress = false; // 0 电源按键未发现异常 1 电源按键被长时间按下警告
  bool someBatteriesNotWork = false; // 0 未发现有电池不工作 1 有部分电池未工作警告
  bool batteryCaliError = false; // 0 未发现电池电压校准异常 1 电池电压校准异常警告
  bool batteryWarning = false; // 0 电池无报警 1 电池报警
  bool batteryProtect = false; // 0 电池未保护 1 电池保护
  bool chargeOverCurrent = false; // 0 充电未过流 1 充电过流（由驱动板检测的过流）
  bool dcOutputOverCurrent = false; // 0 直流输出口未过流 1 直流输出口过流
  bool swCombination = false; // 0 未发现软件不匹配 1 各组件软件不匹配警告
  bool forceDfu = false; // 0 无强制固件升级 1 强制固件升级警告
  bool deviceLock = false; // 0 未锁定 1 车辆已被锁定警告
  bool hwCombination = false; // 0 未发现硬件不匹配 1 各组件硬件不匹配警告
  bool fanLowSpeed = false; // 0 未发现风扇转速过低 1 风扇转速过低警告（会使前灯最大亮度被迫降低）
  bool hwOverCurrent = false; // 0 未出现硬件过流 1 硬件过流保护

  // 从字节数据解析
  LorinRealtimeError.fromBytes(Uint8List bytes) : super.fromBytes(bytes) {
    if (bytes.length < minLength) {
      throw ArgumentError(
          '字节数组长度不足，无法解析 $runtimeType，期望长度至少为 $minLength，实际长度为 ${bytes.length}');
    }

    var byteData = ByteData.sublistView(bytes);
    int offset = 0;

    // 故障信息处理 (4 bytes)
    int byte1 = byteData.getUint8(offset);
    iPhaseSensor = BitUtils.isBitOne(byte1, 0);
    iBusSensor = BitUtils.isBitOne(byte1, 1);
    motorHall1 = BitUtils.isBitOne(byte1, 2);
    motorHall2 = BitUtils.isBitOne(byte1, 3);
    batteryError = BitUtils.isBitOne(byte1, 4);
    imuSensor = BitUtils.isBitOne(byte1, 5);
    mcComm1 = BitUtils.isBitOne(byte1, 6);
    mcComm2 = BitUtils.isBitOne(byte1, 7);

    offset += 1;
    int byte2 = byteData.getUint8(offset);
    bleComm1 = BitUtils.isBitOne(byte2, 0);
    bleComm2 = BitUtils.isBitOne(byte2, 1);
    batteryCommLost = BitUtils.isBitOne(byte2, 2);
    batteryCrossCommLost = BitUtils.isBitOne(byte2, 3);
    mosTempSensor = BitUtils.isBitOne(byte2, 4);
    motorTempSensor = BitUtils.isBitOne(byte2, 5);
    boardTempSensor = BitUtils.isBitOne(byte2, 6);
    fan = BitUtils.isBitOne(byte2, 7);

    offset += 1;
    int byte3 = byteData.getUint8(offset);
    rtc = BitUtils.isBitOne(byte3, 0);
    extRom = BitUtils.isBitOne(byte3, 1);
    vBusSensor = BitUtils.isBitOne(byte3, 2);
    vBatterySensor = BitUtils.isBitOne(byte3, 3);
    cannotPowerOff = BitUtils.isBitOne(byte3, 4);
    cannotCharge = BitUtils.isBitOne(byte3, 5);
    tboxComm = BitUtils.isBitOne(byte3, 6);
    errorReserve = BitUtils.getBits(byte3, 7, 1); // 1st bit of errorReserve

    offset += 1;
    int byte4 = byteData.getUint8(offset);
    // Remaining 8 bits of errorReserve (total 9 bits)
    errorReserve |= (byte4 & 0xFF) << 1;

    // 警告信息处理 (4 bytes)
    offset += 1;
    int byte5 = byteData.getUint8(offset);
    underVoltage = BitUtils.isBitOne(byte5, 0);
    overVoltage = BitUtils.isBitOne(byte5, 1);
    overCurrent = BitUtils.getBits(byte5, 2, 1);
    lowBattery = BitUtils.getBits(byte5, 4, 1);
    mosOverTemp = BitUtils.isBitOne(byte5, 6);
    motorOverTemp = BitUtils.isBitOne(byte5, 7);

    offset += 1;
    int byte6 = byteData.getUint8(offset);
    boardOverTemp = BitUtils.isBitOne(byte6, 0);
    cpuOverTemp = BitUtils.isBitOne(byte6, 1);
    imuOverTemp = BitUtils.isBitOne(byte6, 2);
    overSpeed = BitUtils.isBitOne(byte6, 3);
    outputSaturation = BitUtils.isBitOne(byte6, 4);
    motorSpin = BitUtils.isBitOne(byte6, 5);
    motorStall = BitUtils.isBitOne(byte6, 6);
    postureError = BitUtils.isBitOne(byte6, 7);

    offset += 1;
    int byte7 = byteData.getUint8(offset);
    riskBehaviour = BitUtils.isBitOne(byte7, 0);
    motorNoLoad = BitUtils.isBitOne(byte7, 1);
    noSelfTest = BitUtils.isBitOne(byte7, 2);
    powerKeyLongPress = BitUtils.isBitOne(byte7, 3);
    someBatteriesNotWork = BitUtils.isBitOne(byte7, 4);
    batteryCaliError = BitUtils.isBitOne(byte7, 5);
    batteryWarning = BitUtils.isBitOne(byte7, 6);
    batteryProtect = BitUtils.isBitOne(byte7, 7);

    offset += 1;
    int byte8 = byteData.getUint8(offset);
    chargeOverCurrent = BitUtils.isBitOne(byte8, 0);
    dcOutputOverCurrent = BitUtils.isBitOne(byte8, 1);
    swCombination = BitUtils.isBitOne(byte8, 2);
    forceDfu = BitUtils.isBitOne(byte8, 3);
    deviceLock = BitUtils.isBitOne(byte8, 4);
    hwCombination = BitUtils.isBitOne(byte8, 5);
    fanLowSpeed = BitUtils.isBitOne(byte8, 6);
    hwOverCurrent = BitUtils.isBitOne(byte8, 7);
  }

  // 将对象转换为字节数据
  @override
  Uint8List toBytes() {
    var byteData = ByteData(minLength);
    // 故障信息
    int faultValue = _faultIntValue();
    // 警告信息
    int warningValue = _warinningIntValue();

    byteData.setUint32(0, faultValue);
    byteData.setUint32(4, warningValue);

    return byteData.buffer.asUint8List();
  }

  // 故障信息转换为整数
  _faultIntValue() {
    int faultValue = 0;
    faultValue |= BitUtils.setBit(0, iPhaseSensor);
    faultValue |= BitUtils.setBit(1, iBusSensor);
    faultValue |= BitUtils.setBit(2, motorHall1);
    faultValue |= BitUtils.setBit(3, motorHall2);
    faultValue |= BitUtils.setBit(4, batteryError);
    faultValue |= BitUtils.setBit(5, imuSensor);
    faultValue |= BitUtils.setBit(6, mcComm1);
    faultValue |= BitUtils.setBit(7, mcComm2);
    faultValue |= BitUtils.setBit(8, bleComm1);
    faultValue |= BitUtils.setBit(9, bleComm2);
    faultValue |= BitUtils.setBit(10, batteryCommLost);
    faultValue |= BitUtils.setBit(11, batteryCrossCommLost);
    faultValue |= BitUtils.setBit(12, mosTempSensor);
    faultValue |= BitUtils.setBit(13, motorTempSensor);
    faultValue |= BitUtils.setBit(14, boardTempSensor);
    faultValue |= BitUtils.setBit(15, fan);
    faultValue |= BitUtils.setBit(16, rtc);
    faultValue |= BitUtils.setBit(17, extRom);
    faultValue |= BitUtils.setBit(18, vBusSensor);
    faultValue |= BitUtils.setBit(19, vBatterySensor);
    faultValue |= BitUtils.setBit(20, cannotPowerOff);
    faultValue |= BitUtils.setBit(21, cannotCharge);
    faultValue |= BitUtils.setBit(22, tboxComm);
    faultValue |= (errorReserve & 0x1FF) << 23;
    return faultValue;
  }

  // 警告信息转换为整数
  _warinningIntValue() {
    int warningValue = 0;
    warningValue |= BitUtils.setBit(0, underVoltage);
    warningValue |= BitUtils.setBit(1, overVoltage);
    warningValue |= (overCurrent & 0x3) << 2;
    warningValue |= (lowBattery & 0x3) << 4;
    warningValue |= BitUtils.setBit(6, mosOverTemp);
    warningValue |= BitUtils.setBit(7, motorOverTemp);
    warningValue |= BitUtils.setBit(8, boardOverTemp);
    warningValue |= BitUtils.setBit(9, cpuOverTemp);
    warningValue |= BitUtils.setBit(10, imuOverTemp);
    warningValue |= BitUtils.setBit(11, overSpeed);
    warningValue |= BitUtils.setBit(12, outputSaturation);
    warningValue |= BitUtils.setBit(13, motorSpin);
    warningValue |= BitUtils.setBit(14, motorStall);
    warningValue |= BitUtils.setBit(15, postureError);
    warningValue |= BitUtils.setBit(16, riskBehaviour);
    warningValue |= BitUtils.setBit(17, motorNoLoad);
    warningValue |= BitUtils.setBit(18, noSelfTest);
    warningValue |= BitUtils.setBit(19, powerKeyLongPress);
    warningValue |= BitUtils.setBit(20, someBatteriesNotWork);
    warningValue |= BitUtils.setBit(21, batteryCaliError);
    warningValue |= BitUtils.setBit(22, batteryWarning);
    warningValue |= BitUtils.setBit(23, batteryProtect);
    warningValue |= BitUtils.setBit(24, chargeOverCurrent);
    warningValue |= BitUtils.setBit(25, dcOutputOverCurrent);
    warningValue |= BitUtils.setBit(26, swCombination);
    warningValue |= BitUtils.setBit(27, forceDfu);
    warningValue |= BitUtils.setBit(28, deviceLock);
    warningValue |= BitUtils.setBit(29, hwCombination);
    warningValue |= BitUtils.setBit(30, fanLowSpeed);
    warningValue |= BitUtils.setBit(31, hwOverCurrent);
    return warningValue;
  }

  // 将对象转换为Map
  @override
  Map<String, dynamic> toMap() {
    return {
      // 故障信息
      'i_phase_sensor': iPhaseSensor,
      'i_bus_sensor': iBusSensor,
      'motor_hall1': motorHall1,
      'motor_hall2': motorHall2,
      'battery_error': batteryError,
      'imu_sensor': imuSensor,
      'mc_comm1': mcComm1,
      'mc_comm2': mcComm2,
      'ble_comm1': bleComm1,
      'ble_comm2': bleComm2,
      'battery_comm_lost': batteryCommLost,
      'battery_cross_comm_lost': batteryCrossCommLost,
      'mos_temp_sensor': mosTempSensor,
      'motor_temp_sensor': motorTempSensor,
      'board_temp_sensor': boardTempSensor,
      'fan': fan,
      'rtc': rtc,
      'ext_rom': extRom,
      'v_bus_sensor': vBusSensor,
      'v_battery_sensor': vBatterySensor,
      'cannot_power_off': cannotPowerOff,
      'cannot_charge': cannotCharge,
      'tbox_comm': tboxComm,
      'error_reserve': errorReserve,

      // 警告信息
      'under_voltage': underVoltage,
      'over_voltage': overVoltage,
      'over_current': overCurrent,
      'low_battery': lowBattery,
      'mos_over_temp': mosOverTemp,
      'motor_over_temp': motorOverTemp,
      'board_over_temp': boardOverTemp,
      'cpu_over_temp': cpuOverTemp,
      'imu_over_temp': imuOverTemp,
      'over_speed': overSpeed,
      'output_saturation': outputSaturation,
      'motor_spin': motorSpin,
      'motor_stall': motorStall,
      'posture_error': postureError,
      'risk_behaviour': riskBehaviour,
      'motor_no_load': motorNoLoad,
      'no_self_test': noSelfTest,
      'power_key_long_press': powerKeyLongPress,
      'some_batteries_not_work': someBatteriesNotWork,
      'battery_cali_error': batteryCaliError,
      'battery_warning': batteryWarning,
      'battery_protect': batteryProtect,
      'charge_over_current': chargeOverCurrent,
      'dc_output_over_current': dcOutputOverCurrent,
      'sw_combination': swCombination,
      'force_dfu': forceDfu,
      'device_lock': deviceLock,
      'hw_combination': hwCombination,
      'fan_low_speed': fanLowSpeed,
      'hw_over_current': hwOverCurrent,
    };
  }

  @override
  int dataIntValue() {
    return Utils.computeDataIntVal(toBytes());
  }

  @override
  int dataLength() {
    return toBytes().length;
  }

  @override
  int get minLength => 8;
}
